package cn.com.utt.unms.utils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import cn.com.utt.unms.vo.GraphQueryResponse;
import cn.com.utt.unms.vo.GraphQueryValue;

public class GraphUtils {
	public static List<GraphQueryResponse> MergeGraphDataByCounter(List<GraphQueryResponse> datas, boolean flag) {
		Map<String, List<GraphQueryResponse>> series = new HashMap<>();
		for (GraphQueryResponse data : datas) {
			List<GraphQueryResponse> serie = series.get(data.getCounter());
			if (serie == null) {
				serie = new ArrayList<>();
				serie.add(data);
				series.put(data.getCounter(), serie);
			} else {
				serie.add(data);
			}
		}
		List<GraphQueryResponse> sums = new ArrayList<>();
		for (Map.Entry<String, List<GraphQueryResponse>> e : series.entrySet()) {
			List<GraphQueryResponse> serie = e.getValue();
			List<GraphQueryValue> sumValues = mergeList(serie, flag);
			GraphQueryResponse sum = new GraphQueryResponse();
			sum.setCounter(serie.get(0).getCounter());
			sum.setValues(sumValues);
			sums.add(sum);
		}
		return sums;
	}

	private static List<GraphQueryValue> mergeList(List<GraphQueryResponse> serie, boolean flag) {
		List<GraphQueryValue> sumValues = new ArrayList<>();
		for (int i = 0; i < serie.size(); i++) {
			if (i == 0) {
				sumValues = serie.get(i).getValues();
				if (!flag) {
					for (int j = 0; j < sumValues.size(); j++) {
						sumValues.get(j).setValue(
								sumValues.get(j).getValue() == null ? 0 : Math.ceil(sumValues.get(j).getValue()));
					}
				}

			} else {
				List<GraphQueryValue> tempValues = serie.get(i).getValues();
				if (sumValues.size() > tempValues.size()) {
					for (int j = 0; j < tempValues.size(); j++) {
						if (flag) {
							sumValues.set(j,
									new GraphQueryValue(tempValues.get(j).getTimestamp() * 1000, sumValue(
											sumValues.get(j).getValue() == null ? 0 : sumValues.get(j).getValue(),
											tempValues.get(j).getValue() == null ? 0 : tempValues.get(j).getValue())));
						} else {
							sumValues.set(j,
									new GraphQueryValue(tempValues.get(j).getTimestamp() * 1000,
											sumValue(
													sumValues.get(j).getValue() == null ? 0
															: Math.ceil(sumValues.get(j).getValue()),
													tempValues.get(j).getValue() == null ? 0
															: Math.ceil(tempValues.get(j).getValue()))));
						}
					}
				} else {
					for (int j = 0; j < tempValues.size(); j++) {
						if (flag) {
							tempValues.set(j,
									new GraphQueryValue(tempValues.get(j).getTimestamp() * 1000,
											sumValue(
													sumValues.size() <= j
															? 0
															: (sumValues.get(j).getValue() == null ? 0
																	: sumValues.get(j).getValue()),
													tempValues.get(j).getValue() == null ? 0
															: tempValues.get(j).getValue())));
						} else {
							tempValues.set(j,
									new GraphQueryValue(tempValues.get(j).getTimestamp() * 1000,
											sumValue(
													sumValues.size() <= j ? 0
															: (sumValues.get(j).getValue() == null ? 0
																	: Math.ceil(sumValues.get(j).getValue())),
													tempValues.get(j).getValue() == null ? 0
															: Math.ceil(tempValues.get(j).getValue()))));
						}

						if (sumValues.size() <= j) {
							sumValues.add(tempValues.get(j));
						} else {
							sumValues.set(j, tempValues.get(j));
						}
					}
				}
			}
		}
		return sumValues;
	}

	public static double sumValue(double a, double b) {
		if (Double.isNaN(a) && Double.isNaN(b)) {
			return Double.NaN;
		} else if (Double.isNaN(a)) {
			return b;
		} else if (Double.isNaN(b)) {
			return a;
		} else {
			return a + b;
		}
	}

	public static GraphQueryResponse countGraphDataByTimestamp(List<GraphQueryResponse> sums) {
		GraphQueryResponse gqrp = new GraphQueryResponse();
		gqrp.setCounter("total");
		gqrp.setStep(0);
		List<GraphQueryValue> value = new ArrayList<GraphQueryValue>();
		int listlong = 0;
		if (sums.get(0).getValues().size() <= sums.get(1).getValues().size()) {
			listlong = sums.get(0).getValues().size();
		} else {
			listlong = sums.get(1).getValues().size();
		}
		for (int i = 0; i < listlong; i++) {
			GraphQueryValue gqv = new GraphQueryValue();
			Long time1 = sums.get(0).getValues().get(i).getTimestamp().longValue();
			Long time2 = sums.get(1).getValues().get(i).getTimestamp().longValue();
			Double value1 = sums.get(0).getValues().get(i).getValue();
			Double value2 = sums.get(1).getValues().get(i).getValue();
			if (time1.equals(time2)) {
				gqv.setTimestamp(time1);
				if (value1 == null) {
					if (value2 == null) {
						gqv.setValue(null);
					} else {
						gqv.setValue(value2);
					}
				} else {
					if (value2 == null) {
						gqv.setValue(value1);
					} else {
						gqv.setValue(value1 + value2);
					}

				}
				// if(sums.get(0).getValues().get(i).getValue()!=null&&sums.get(1).getValues().get(i).getValue()!=null){
				// gqv.setValue(sums.get(0).getValues().get(i).getValue()+sums.get(1).getValues().get(i).getValue());
				// }else{
				// gqv.setValue(null);
				// }

			}
			value.add(gqv);
		}
		gqrp.setValues(value);
		return gqrp;
	}
	// public static void main(String[] args) {
	// String result="["
	// + "{\"endpoint\": \"20171213\",\"counter\":
	// \"net.clients.client24g\",\"dstype\": \"GAUGE\", \"step\": 60, "
	// + "\"Values\": [{\"timestamp\": 1513491000, \"value\":
	// null},{\"timestamp\": 1513491000, \"value\": null},{\"timestamp\":
	// 1513491000, \"value\": 0.7},{\"timestamp\": 1513491000, \"value\":
	// 2},{\"timestamp\": 1513491000, \"value\": 0}]},"
	// + "{\"endpoint\": \"20171213\",\"counter\":
	// \"net.clients.client5g\",\"dstype\": \"GAUGE\", \"step\": 60, "
	// + "\"Values\": [{\"timestamp\": 1513491000, \"value\":
	// null},{\"timestamp\": 1513491000, \"value\": 1},{\"timestamp\":
	// 1513491000, \"value\": 3},{\"timestamp\": 1513491000, \"value\":
	// 0.1},{\"timestamp\": 1513491000, \"value\": 1.1}]}"
	// + "]";
	// List<GraphQueryResponse> resps =
	// JSON.parseArray(result,GraphQueryResponse.class);
	// List<GraphQueryResponse> sums =
	// GraphUtils.MergeGraphDataByCounter(resps,false);
	// System.out.println("24小时ap客流统计 sums: ");
	// System.out.println(JSON.toJSON(sums));
	// //计算2.4g与5g的总数据
	// sums.add(GraphUtils.countGraphDataByTimestamp(sums));
	//
	// System.out.println(JSON.toJSONString(sums));
	// }
}
